iT邦幫忙

1
鐵人賽 神助攻 HERE Technologies

快速建構地圖服務(十三)- HERE Geofencing 地理圍籬

WW 2020-10-05 16:34:572725 瀏覽
  • 分享至 

  • xImage
  •  

快速建構地圖服務(十三)- HERE Geofencing 地理圍籬

因為 COVID-19 的關係,地理圍籬變成一個眾所周知的服務,因為這樣的技術被用來監控居家隔離對象是否離開住所。

一般而言我們在談到地理圍籬的時候,想像的通常是一個確定的區域,不管是方形、或多邊形,但 HERE 的地理圍籬可以用點、線、面(多邊形)的方式存在,因此在使用上就更加的有彈性了。

以剛剛貨運行的例子來看,我除了可以監控司機是否已經到達或離開客戶的工廠,我還可以把送貨的路線設定成地理圍籬,因此也可以監控司機是否有偏離送貨路線的狀況,這種用途對於高價值的貨品(例如運鈔車),以及人身安全監控(例如重要人士的的接送、計程車、兒童安全監視等)都很有幫助。

HERE Geofencing 的功能與特色

如同之前在 快速建構地圖服務(十二)- HERE Custom Locations 地圖資料倉儲與查詢 所描述的,HERE Geofencing 的後台其實就是 Custom Locations,也可以說 Geofencing 是 Custom Locations 的延伸應用。

假設您現在正在製作一個 APP,這個 APP 會安裝在兒童的手錶上,而手錶每分鐘會回報 GPS 的位置到雲端的控制中心,而控制中心會檢查這個 GPS 位置是否在家長設定好的特定區域中,例如家中、親戚家、安親班、學校等等。藉由 HERE Geofencing 的服務,每一次的查詢都會告訴您該 GPS 位置是否在特定的圍籬內,如果不在圍籬的區域,也會告訴您距離有多遠。

實做時的注意事項

當然以 HERE 的角度來說,並不會限制使用者的用量,因為您使用的愈多,HERE 當然是多多益善(收費更多);然而以實務上來說,您會需要考量裝置的電量(如果是穿戴式裝置或是 GPS 追蹤器,電池通常不會太大)以及流量(以 GPS 追蹤器來說,上面的 SIM 卡容量通常相當有限),因此比較建議您可以針對不同的場景設定查詢的頻率。

例如以剛剛的兒童監控的場景來看,一般來說我們可以設定上課時間的查詢間隔可以拉長,因為如果孩童在上課時間不見蹤影,第一個會發現的是學校,而學校也會即時啟動搜尋以及通報家長;但下課時間就必須要縮短查詢的間隔,尤其是下課後到回家前這段路程最為關鍵。您可以在裝置上面設定不同的時間點與地點以不同的時間間隔進行查詢。

HERE Geofencing 初體驗

製作地理圍籬

剛剛提過,HERE Geofencing 的後台跟 Custom Locations 是一樣的,因此您在設定地理圍籬的時候,就要用 Custom Locations 所接受的格式。

首先打開 QGIS,新增一個專案,然後把 OpenStreetMap 加到底圖,然後 Zoom In 到您偏好的區域。

接著我們新增一個 Shapefile,請選擇功能表中的「Layer」 -> 「Create Layer」 -> 「New Shapefile Layer...」。

接著,在「File name」的部份您可以自己命名您偏好的名稱,在「Geometry type」請選擇「Polygon」,代表我們待會要新增的是多邊形的地理圍籬。

接著下方的 New Field 部份,我們新增一個欄位叫做「name」,在「Name」中輸入「name」,並且按下下方的「Add to Fields List」,把這個新的欄位加入我們要新增的 Shapefile 中。

完成後會像這樣,按下「OK」就可以了。

接著我們在 Layers 就會看到一個新的圖層,目前是沒有內容的。請在上面按下右鍵,並選擇「Toggle Editing」來開啟編輯模式。

接著我們就可以在工具列上面找到這一個「Add polygon」(新增多邊形)的按鈕,按下去,地圖上的游標會變成十字瞄準線。

接著我們找到地圖上的一間國小,依序的在國小的每個邊角都按一下滑鼠左鍵,可以看到有一個淺紅色的框框把國小的校園給蓋住了。

確認覆蓋完全部的校園之後,請按下滑鼠右鍵,這時候會出現一個對話框,請在「name」中輸入這個多邊形的名稱,例如「大新國小」,之後按下「OK」就可以了。新增的多邊形會出現在地圖上。

接著請用同樣的方式在周遭新增幾個多邊形。例如我這邊新增了「公園」、「家樂福」、「網咖」、「圖書館」、「安親班」、「爺爺家」、「住家」等地點。

好的,接著我們在新增的多邊形圖層上面按下右鍵,選擇「Export」->「Save Features As...」。

接著跟我們之前 快速建構地圖服務(十二)- HERE Custom Locations 地圖資料倉儲與查詢 所描述的一樣,「Format」選擇「CSV」,並把檔案存到您偏好的位置。但是請記得編碼一定要是「UTF-8」、「GEOMETRY」一定要是「AS_WKT」、「SEPARATOR」一定要是「TAB」,確認無誤後就按下「OK」把檔案存起來。

打開剛剛儲存的 CSV 檔,第一個欄位是 WKT,且也包含了一串以 MUILTIPOLYGON 開頭的文字,這就是 WKT 格式的多邊形,我們會用這個檔案來上傳作為我們的地理圍籬。

當然,用 QGIS 的方式是比較手動一點的方式,在實務上,您會可能要求使用者用手機螢幕點選的方式或是用位置加上半徑產生近似圓形的多邊形來設定一個範圍,能夠產生多邊形的方式非常多,QGIS 只是用來示範而已。

QGIS 的部份到這邊結束,您可以關掉它。不過在這邊要先做一步,就是您必須把剛剛儲存的 CSV 檔的副檔名從「.csv」 改成「.wkt」。

上傳地理圍籬

接著打開 Postman,新增一個 POST request,網址是「https://fleet.ls.hereapi.com/2/layers/upload.json」,並且在「Params」新增兩個參數:

  • apiKey:您的 HERE API KEY。
  • layer_id:填入「MYGEOFENCE」

接著在「Body」的部份,新增一個「Key」為「zipfile」,在「Key」的右邊選擇「File」,接著按下「Value」的「Select Files」來選到您剛剛儲存的 WKT 檔。

接著就可以按下「Send」來上傳。如果一切操作無誤,您會收到一個 201 的回傳代表上傳成功。

至於如果您之後想要新增、刪除或修改您的地理圍籬,那也請依照 快速建構地圖服務(十二)- HERE Custom Locations 地圖資料倉儲與查詢 所描述的作法就可以了。

查詢地理圍籬

接著我們打開 HERE WeGo 網路地圖,移動到您剛剛建立地理圍籬的位置週邊,接著在地圖上隨意的按下右鍵,會出現一串地址,然後按下那串地址。

接著在左上角的部份,請按下「查看較多資訊」。

這個地址的經緯度就會出現了。

接著請回到 Postman,新增一個 GET request,在網址列貼入「https://fleet.ls.hereapi.com/2/search/proximity.json」,然後在下方的「Params」新增三個參數:

  • apiKey:填入您的 HERE API KEY。
  • layer_ids:填入「MYGEOFENCE」,代表您要搜尋的圖層名稱。
  • proximity:填入您剛剛從 HERE WeGo 地圖上取得的經緯度,後面加上「,1000」代表搜尋 1000 公尺範圍內的地理圍籬,例如「24.14405,120.64769,1000」,請記得不需要留空白。

確認無誤後就請按下「Send」。

如果一切無誤,我們就可以取得回傳。在 geometries 這個 array 裡面,就包含了搜尋範圍 1000 公尺內的地理圍籬,而距離的遠近也會依序排出。

例如第一個「大新國小」,距離(distance)是 103.03 公尺,而「大新國小」這個地理圍籬最接近搜尋位置的經緯度是 24.14498, 120.64771。

{
    "geometries": [
        {
            "attributes": {
                "ID": "",
                "GEOMETRY_ID": "0",
                "NAME": "大新國小"
            },
            "distance": 103.03,
            "nearestLat": 24.14498,
            "nearestLon": 120.64771,
            "layerId": "MYGEOFENCE",
            "geometry": "MULTIPOLYGON(((120.64697 24.14669,120.64802 24.14668,120.64799 24.14497,120.64693 24.14499,120.64697 24.14669)))"
        },
        {
            "attributes": {
                "ID": "",
                "GEOMETRY_ID": "4",
                "NAME": "公園"
            },
            "distance": 119.7,
            "nearestLat": 24.14406,
            "nearestLon": 120.64651,
            "layerId": "MYGEOFENCE",
            "geometry": "MULTIPOLYGON(((120.6439 24.14674,120.64654 24.1467,120.64651 24.1439,120.64328 24.14422,120.6439 24.14674)))"
        },
        {
            "attributes": {
                "ID": "",
                "GEOMETRY_ID": "6",
                "NAME": "安親班"
            },
            "distance": 172.07,
            "nearestLat": 24.14295,
            "nearestLon": 120.6465,
            "layerId": "MYGEOFENCE",
            "geometry": "MULTIPOLYGON(((120.64632 24.14296,120.6465 24.14295,120.64651 24.14271,120.64634 24.14271,120.64632 24.14296)))"
        },
        {
            "attributes": {
                "ID": "",
                "GEOMETRY_ID": "7",
                "NAME": "才藝班"
            },
            "distance": 197.83,
            "nearestLat": 24.14366,
            "nearestLon": 120.64959,
            "layerId": "MYGEOFENCE",
            "geometry": "MULTIPOLYGON(((120.64959 24.14366,120.64978 24.14367,120.64983 24.14352,120.64964 24.14344,120.64959 24.14366)))"
        },
        {
            "attributes": {
                "ID": "",
                "GEOMETRY_ID": "5",
                "NAME": "住家"
            },
            "distance": 388.32,
            "nearestLat": 24.14058,
            "nearestLon": 120.64808,
            "layerId": "MYGEOFENCE",
            "geometry": "MULTIPOLYGON(((120.64808 24.14058,120.64871 24.14053,120.64871 24.14023,120.64807 24.1402,120.64808 24.14058)))"
        },
        {
            "attributes": {
                "ID": "",
                "GEOMETRY_ID": "8",
                "NAME": "爺爺家"
            },
            "distance": 487.62,
            "nearestLat": 24.14271,
            "nearestLon": 120.64312,
            "layerId": "MYGEOFENCE",
            "geometry": "MULTIPOLYGON(((120.64295 24.14273,120.64312 24.14271,120.6431 24.14247,120.64292 24.14249,120.64295 24.14273)))"
        },
        {
            "attributes": {
                "ID": "",
                "GEOMETRY_ID": "3",
                "NAME": "家樂福"
            },
            "distance": 583.21,
            "nearestLat": 24.14919,
            "nearestLon": 120.6488,
            "layerId": "MYGEOFENCE",
            "geometry": "MULTIPOLYGON(((120.64879 24.14987,120.64961 24.14986,120.64966 24.14916,120.6488 24.14919,120.64879 24.14987)))"
        },
        {
            "attributes": {
                "ID": "",
                "GEOMETRY_ID": "1",
                "NAME": "網咖"
            },
            "distance": 589.17,
            "nearestLat": 24.14922,
            "nearestLon": 120.64645,
            "layerId": "MYGEOFENCE",
            "geometry": "MULTIPOLYGON(((120.64611 24.14936,120.64646 24.14936,120.64645 24.14922,120.6461 24.14922,120.64611 24.14936)))"
        },
        {
            "attributes": {
                "ID": "",
                "GEOMETRY_ID": "2",
                "NAME": "圖書館"
            },
            "distance": 643.06,
            "nearestLat": 24.14941,
            "nearestLon": 120.64533,
            "layerId": "MYGEOFENCE",
            "geometry": "MULTIPOLYGON(((120.64531 24.14982,120.64533 24.14941,120.64493 24.14941,120.64493 24.14983,120.64531 24.14982)))"
        }
    ],
    "meta": [
        {
            "layerId": "MYGEOFENCE",
            "lastUpdateTimeStamp": 1601883400017
        }
    ],
    "response_code": "200 OK"
}

如果您把搜尋範圍拿掉,只留下經緯度的話(例如 24.14405,120.64769),回傳的 geometries 會是一個空的 array,代表這個位置並沒有在任何的地理圍籬內:

{
    "geometries": [],
    "meta": [
        {
            "layerId": "MYGEOFENCE",
            "lastUpdateTimeStamp": 1601883400017
        }
    ],
    "response_code": "200 OK"
}

而如果我們提供一個已知在某一個地理圍籬內的經緯度(例如 24.14551,120.64487),就會得到類似以下的回傳,您可以注意到 distance 是負數,nearestLat 與 nearestLon 都是 0.0,代表您搜尋的位置在這個地理圍籬裡面。

{
    "geometries": [
        {
            "attributes": {
                "ID": "",
                "GEOMETRY_ID": "4",
                "NAME": "公園"
            },
            "distance": -9.9999999E7,
            "nearestLat": 0.0,
            "nearestLon": 0.0,
            "layerId": "MYGEOFENCE",
            "geometry": "MULTIPOLYGON(((120.6439 24.14674,120.64654 24.1467,120.64651 24.1439,120.64328 24.14422,120.6439 24.14674)))"
        }
    ],
    "meta": [
        {
            "layerId": "MYGEOFENCE",
            "lastUpdateTimeStamp": 1601883400017
        }
    ],
    "response_code": "200 OK"
}

所以使用 HERE Geofencing,您除了可以知道您想查詢的位置是否在地理圍籬內,也可以知道它距離特定的地理圍籬有多遠。您也可以自行嘗試製作點與線的地理圍籬,作法都是一樣的,只是格式不同而已。

兼談:跟 Google 的 Geofencing 有何不同?

一般人談到地圖第一個聯想到的就是 Google 地圖,而 Google 也提供了 Geofencing 的功能其實 iOS 也有類似的功能),但 Google 的 Geofencing 實做在 Android SDK 中,與 HERE 作為一個網路 API 的服務其實有非常大的差異。

圖片出處:https://developers.google.com/location-context/geofencing
  • 以平台來說,HERE 的 Geofencing 不依賴特定的 SDK,因此支援所有可以送出與接收 HTTP Request 的用途、裝置或平台,因此您可以自由選擇使用在伺服器、手機、車輛、穿戴式裝置、物聯網裝置上;Google 的 Geofencing 只支援 Android。
  • 以靈活性來說,HERE Geofencing 支援點、線、面(任意多邊形);而 Google 的 Geofencing 只支援圓形(位置加上範圍)。
  • 以邏輯上來說,HERE 的 Geofencing 更像是在「查詢」來得到「結果」;而 Google 的 Geofencing 更像是在監聽「事件」來取得「通知」。
  • 以隱私權來說,HERE 的 Geofencing 不會收集、分享、再利用使用者查詢的經緯度,HERE 也不會知道這個查詢的經緯度是否代表特定的物件,例如車輛、人員等等,對於 HERE 的服務來說,這只是一個單純的經緯度。
  • 以用途來說:
    • HERE Geofencing 的用途比較像是在於有特定的管理中心在監控轄下的資產,例如物流公司監控車隊與貨物、公司管理階層監控員工的在廠房內部的位置等等。
    • Google 的 Geofencing 比較像是使用者在監控特定的目標,例如收件人監控貨物是否抵達自己的位置,或是工廠員工監控自己是不是進入了廠房內特定的區域(不過只能是圓形)。

至於實做上怎麼取用,就端看您的需求而定。

「快速建構地圖服務」系列文章

快速建構地圖服務(一) - 認識 HERE Studio / Data Hub
快速建構地圖服務(二) - 認識 HERE Data Hub CLI / API
快速建構地圖服務(三) - 使用 QGIS 玩轉 HERE Data Hub
快速建構地圖服務(四) - 當 Leaflet JS 遇見 Data Hub
快速建構地圖服務(五) - 整合 HERE 地點搜尋 API
快速建構地圖服務(六)- HERE Waypoints Sequence 路徑最佳排序
快速建構地圖服務(七)- 認識 HERE Routing API - 路徑規劃
快速建構地圖服務(八)- 認識 Matrix Routing
快速建構地圖服務(九)- Isoline Routing
快速建構地圖服務(十)- HERE Tour Planning 物流路徑預排與成本精算
快速建構地圖服務(十一)- HERE Route Matching GPS 軌跡分析
快速建構地圖服務(十二)- HERE Custom Locations 地圖資料倉儲與查詢
快速建構地圖服務(十三)- HERE Geofencing 地理圍籬
快速建構地圖服務(十四)- HERE Custom Routes 自建路網 + Vector Tile 向量圖磚 + Map Image API 靜態地圖
快速建構地圖服務(十五)- HERE Positioning 網路定位服務


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
ujhy6699
iT邦新手 5 級 ‧ 2023-01-12 17:04:10

感謝把here的api整理這麼詳細
幫助很大,謝謝!

我要留言

立即登入留言